package br.fesppr.sacob.compilador.analizador;

import br.fesppr.sacob.compilador.entidade.AtributoDB;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import br.fesppr.sacob.compilador.util.Dominios;
import br.fesppr.sacob.compilador.util.Util;

import br.fesppr.sacob.compilador.entidade.Token;
import br.fesppr.sacob.compilador.entidade.Valores;

public class Sintatico {

	/*
	 * {cnmvo,;}
	 * S -> cC 
	 * C -> nmD | nD | D 
	 * D -> vE | vE 
	 * E -> oF | F | G
	 * F -> vE | vG
	 * G -> ,S | ;S | X
	 * 
	 * produto 3 ou 4, cliente com silva;
	 * produto come�a com shampoo, aberto ontem
	 */
	
	private List<AtributoDB> listaDB;
	private List<Valores> condicoes;
	private List<Valores> complementos;
	private AtributoDB atributoAtual;
	private Iterator<Token> tokenIt;
	private Token tokenAtual;
	private StringBuilder select;
	private StringBuilder aux;
	private List<String> tabelas;
	
	public String montaSelect(List<Token> listaToken){
		
		tokenIt = listaToken.iterator();
		tabelas = new ArrayList<String>();
		listaDB = Util.preencheAtributosDB();
		condicoes = Util.preencheCondicoes();
		complementos = Util.preencheComplementos();
		aux = new StringBuilder();
		select = new StringBuilder();
		
		S();
		
		return select.toString();
	}
	
	private void S(){
		try{
			tokenAtual = tokenIt.next();
			
			if(ehColuna()){
				if(!tabelas.contains(atributoAtual.getTabela())){
					tabelas.add(atributoAtual.getTabela());
				}
				if("".equals(aux.toString())){
					aux.append("(");
					aux.append(atributoAtual.getTabela()).append(".");
					aux.append(atributoAtual.getColuna()).append(" ");
				}
			}
			
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	private void C(){
		try{
			tokenAtual = tokenIt.next();
			
			if(ehCondicao()){
				//--
			}
			
			
			
			
			
			
			
			
		}catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	private void D(){
		if(tokenIt.hasNext()){
			tokenAtual = tokenIt.next();
		}
	}
	
	private void E(){
		if(tokenIt.hasNext()){
			tokenAtual = tokenIt.next();
		}
	}
	
	private void F(){
		if(tokenIt.hasNext()){
			tokenAtual = tokenIt.next();
		}
	}
	
	private void G(){
		if(tokenIt.hasNext()){
			tokenAtual = tokenIt.next();
		}
	}
	
	private boolean ehColuna(){
		
		boolean ehColuna = false;
		
		try {
			
			tokenAtual = tokenIt.next();
			
			for(AtributoDB atributo : listaDB){
				if(atributo.getColuna().equals(tokenAtual.getValor())){
					atributoAtual = atributo;
					ehColuna = true;
					break;
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		return ehColuna;
	}
	
	private boolean ehCondicao(){
		
		boolean ehCondicao = false;
		
		for(Valores v : condicoes){
			if(v.getDescricao().equalsIgnoreCase(tokenAtual.getValor())){
				ehCondicao = true;
			}
		}
		
		return ehCondicao;
		
	}
	
	private boolean ehComplemento(){
		
		boolean ehComplemento = false;
		
		for(Valores v : complementos){
			if(v.getDescricao().equalsIgnoreCase(tokenAtual.getValor())){
				ehComplemento = true;
			}
		}
		
		return ehComplemento;
	}
	
}
